package pers.xiaojun.boot.common.util;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

import java.time.Duration;
import java.util.concurrent.Executors;

/**
 * 本地缓存根据
 *
 * @author xiaojun
 * @since 2025-11-08
 */
public class CacheUtils {

    private static final int MAXIMUM_SIZE = 1000;

    /**
     * 创建一个 带有异步刷新功能的 Guava 缓存（LoadingCache），
     * 在缓存数据写入一段时间后自动触发刷新（而不是等到下次访问才加载）。
     *
     * @param duration 缓存刷新间隔
     * @param loader   缓存加载器（加载数据）
     * @param <K>      键值类
     * @param <V>      属性值类
     * @return {@link LoadingCache}
     */
    public static <K, V> LoadingCache<K, V> buildAsyncReloadingCache(Duration duration, CacheLoader<K, V> loader) {
        return CacheBuilder.newBuilder()
                .maximumSize(MAXIMUM_SIZE)
                .refreshAfterWrite(duration)
                // 把原来的同步 CacheLoader 包装成异步加载器，当缓存需要刷新时，使用给定线程池（newCachedThreadPool()）异步执行加载任务。
                .build(CacheLoader.asyncReloading(loader, Executors.newSingleThreadExecutor()));
    }

}
